//
//  BEAccountModel.swift
//  BEGlobalOiler
//
//  Created by KKING on 16/9/8.
//  Copyright © 2016年 Bullseye Energy pte ltd. All rights reserved.
//

import UIKit

class BEAccountModel: NSObject, NSCoding {
    // MARK: - 归档和解档
    public func encode(with aCoder: NSCoder) {
        aCoder.encode(authToken, forKey: "token_key")
        aCoder.encode(username, forKey: "username_key")
        aCoder.encode(userId, forKey: "userid_key")
    }
    
    required init?(coder aDecoder: NSCoder) {
        authToken = aDecoder.decodeObject(forKey: "token_key") as? String
        username = aDecoder.decodeObject(forKey: "username_key") as? String
        userId = aDecoder.decodeObject(forKey: "userId_key") as? String
    }
    
    
    /// 令牌
    var authToken: String?
    
    /// 用户id
    var userId: String?
    
    /// 用户名
    var username: String?
    
    
    
    
    // MARK: - 转模型
    // KVC 字典转模型
    init(dict: [String: AnyObject]) {
        super.init()
        setValuesForKeys(dict)
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
    
    // MARK: - 外部调用接口
    /**
     获取用户对象 （这可不是单例哦，只是对象静态化了，保证在内存中不释放）
     */
    static func shareAccount() -> BEAccountModel? {
        if userAccount == nil {
            userAccount = NSKeyedUnarchiver.unarchiveObject(withFile: accountPath) as? BEAccountModel
            
            return userAccount
        } else {
            //            print(userAccount)
            
            return userAccount
        }
    }
    
    /**
     是否已经登录
     */
    class func isLogin() -> Bool {
        return BEAccountModel.shareAccount() != nil
    }
    
    /**
     注销清理
     */
    class func logout() {
        // 清除内存中的账户数据和归档中的数据
        BEAccountModel.userAccount = nil
        do {
            try FileManager.default.removeItem(atPath: BEAccountModel.accountPath)
        } catch {
            //            print("退出异常")
        }
    }
    
    /**
     心跳
     */
    class func checkToken() {
        if BEAccountModel.isLogin() {
            //            guard let expiryTime = BEAccountModel.shareAccount()?.expiryTime else {
            //                return
            //            }
            //
            //            // 获取当前时间的时间戳
            //            let nowTime = NSDate().timeIntervalSince1970
            //            if nowTime > NSTimeInterval(expiryTime) {
            //                BEAccountModel.logout()
            //            }
        }
    }
    
    // MARK: - 内部处理方法
    /**
     登录保存用户信息
     */
    func saveUserInfo() {
        // 保存到内存中
        BEAccountModel.userAccount = self
        // 归档用户信息
        saveAccount()
    }
    
    // 持久保存到内存中
    private static var userAccount: BEAccountModel?
    
    /// 归档账号的路径
    static let accountPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! + "/Account.plist"
    
    /**
     归档用户数据
     */
    private func saveAccount() {
        NSKeyedArchiver.archiveRootObject(self, toFile: BEAccountModel.accountPath)
    }
    
    
}

// MARK: - 各种网络请求
extension BEAccountModel {
    
    /**
     普通账号登录
     
     - parameter type:     登录类型
     - parameter username: 用户名/邮箱/手机号码
     - parameter password: 密码
     - parameter finished: 完成回调
     */
    class func normalAccountLogin(username: String, password: String, finished: @escaping (_ success: Bool, _ tip: String) -> ()) {
        
        BENetworkTools.shareNetworkTool.normalAccountLogin(username: username, password: password) { (success, result, error) in
            
            guard let resultjson = result else {
                finished(false, "Network fault!")
                return
            }
            if resultjson["success"] == true {
                let account = BEAccountModel(dict: resultjson["result"].dictionaryObject! as [String : AnyObject])
                account.saveUserInfo()
                
                finished(true, "登录成功")
            } else {
                finished(false, resultjson["message"].stringValue)
            }
        }
    }
}
